/**
 * @Project : algorithm-learning
 * @Author : Ruoyu Wang
 * @User : Momenta
 * @DateTime : 2024/3/24 13:43
 */

//小红在玩战略游戏，地图上有n个国家排成一排，小红的军队初始时在1号国家，她需要率领军队进攻n号国家。
//军队每从一个国家移动到一个相邻国家就需要消耗1单位的粮食，
//每个国家都会售卖粮食，每单位价格为a_i，小红可以购买任意单位的粮食。
//若军队携带的粮食数量大于1单位，小红需要对大于1的部分付出额外的代价运输粮食，每运输1单位粮食移动到一个相邻国家需要花费1。
//小红想知道她要到达n号国家的最少花费是多少。
//
//输入描述
//  第一行输入一个整数n(1≤n≤10^5)表示国家个数。
//  第二行输入n个整数表示每个国家的粮食售价ai(1≤ai≤10^5)。
//输出描述
//  输出一个整数表示答案。
//
//示例1
//输入
//4
//1 3 2 4
//输出
//5
//说明
//  在第1个国家购买2单位粮食，花费2。
//  将1单位粮食从第1个国家运送到第2个国家，花费1。
//  在第2个国家购买0单位粮食，花费0。
//  在第3个国家购买1单位粮食，花费2。
//  因此答案为2+1+2=5。

#include <cstdio>
#include <algorithm>

using namespace std;

/**
 * 贪心 O(n)
 */
int main() {
    int n;
    scanf("%d", &n);
    int a[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    long long res = 0;
    int price = a[0];
    int idx = 0;

    for (int i = 1; i < n; i++) {
        if (a[i] - price >= i - idx) {
            res += price;
            res += i - idx - 1;
        } else {
            res += price;
            res += i - idx - 1;
            price = a[i];
            idx = i;
        }
    }

    printf("%lld", res);

    return 0;
}

/**
 * dp O(n^2)
 */
//int main() {
//    int n;
//    scanf("%d", &n);
//    int a[n];
//    for (int i = 0; i < n; i++) {
//        scanf("%d", &a[i]);
//    }
//
//    long long f[n];
//    f[0] = 0;
//    for (int i = 1; i < n; i++) {
//        f[i] = 0x3f3f3f3f3f3f3f3f;
//        for (int j = i - 1; j >= 0; j--) {
//            long long tmp = (long long) (i - j) * a[j];
//            if (i - j > 1) {
//                tmp += (long long) (i - j) * (i - j - 1) / 2;
//            }
//            f[i] = min(f[i], f[j] + tmp);
//        }
//    }
//
//    printf("%lld", f[n - 1]);
//
//    return 0;
//}